package com.itheima.d2_recursion;

import java.io.File;

/**
 * @ClassName Test2
 * @Author 16799
 * @Date 2025/8/22 23:06
 * @Version 1.0
 * @Description TODO
 *
 *  需求：删除非空文件夹
 * 分析：
 * ①：File默认不可以删除非空文件夹
 * ②：我们需要遍历文件夹，先删除里面的内容，再删除自己。
 *
 *  黑马第155集这部分视频内容也是后期缝合的，给的源码里面没有这部分内容，但是ppt有相关的内容,视频时间：2023.5.12，也是线下课
 **/
public class Test2 {
    public static void main(String[] args) {
        //目标，删除非空文件夹。需要遍历删除文件，最后删除文件夹，独立功能写成独立方法
        File file = new File("D:\\Idea\\resource\\用来删除案例test2的");
        //文件夹里面有内容，无法删除
        //System.out.println(file.delete());

        deleteDir(file);

    }

    public static void deleteDir(File dir){
        //需要做极端判断：为空，路径写错了所以路径对应的文件对象不存在
        if (dir == null || !dir.exists()){
            System.out.println("false");
            return;
        }
        //当前文件对象是文件，而不是文件夹
        if (dir.isFile()){
            dir.delete();
            return;
        }
        //1.经过上面两个过滤，dir存在且是文件夹，拿里面的一级文件对象
        //分析：需要先判断这个文件夹下面是不是空的，因为有权限不够不能读取的文件。
        // 需要提取这个文件夹下面的全部一级文件对象，因为有些情况下没有权限去拿文件下的一级文件对象，返回的是null，连访问权限都没有，所以有没有删除权限
        File[] files = dir.listFiles();
        if (files==null){
            return;
        }

/*
        //也有可能里面有空文件夹，也是需要直接删除
        if (files.length==0){
            dir.delete();
            return;
        }
        //写完之后的马后炮：如果判断文件夹是空的话，在下面的for循环不会遍历直接走到dir.delete();，所以这段代码可以删掉
*/

        //2.经过上面步骤的过滤，说明既不是 没有权限访问文件，也不是空文件夹，是有内容的文件夹
        //所以需要遍历里面的文件夹，然后依次删除内容
        for (File file : files) {
            //删除的逻辑和上面的判断逻辑是一样的
            if (file.isFile()){
                file.delete();
            }else {
                deleteDir(file);
            }
        }

        //上面整个循环执行完了，说明就已经把文件夹下面的所有一级文件对象内容全部干掉了
        //最后记得要把自己干掉
        dir.delete();



    }
}
